/*
 * Copyright (c) 2018, apexes.net. All rights reserved.
 *
 *         http://www.apexes.net
 *
 */
package net.apexes.commons.i18n;

import net.apexes.commons.lang.Enume;

import java.util.Enumeration;
import java.util.Locale;

/**
 * 
 * @author <a href=mailto:hedyn@foxmail.com>HeDYn</a>
 *
 */
public final class EnumMsg {
    
    private final I18nMsg msg;

    public EnumMsg(I18nResource resource) {
        msg = new I18nMsg(resource);
    }

    public EnumMsg(I18nResource resource, I18nMsg.Logger logger) {
        msg = new I18nMsg(resource, logger);
    }
    
    public Locale getLocale() {
        return msg.getLocale();
    }

    public Enumeration<String> getKeys() {
        return msg.getKeys();
    }

    public boolean containsKey(String key) {
        return msg.containsKey(key);
    }

    public String getMessage(String key) {
        return msg.getMessage(key, key);
    }

    public String getMessage(String key, String defaultValue) {
        return msg.getMessage(key, defaultValue);
    }

    public String formatKey(String key, Object... params) {
        return msg.formatKey(key, params);
    }
    
    /**
     * 返回枚举的名称
     * @param theEnum 枚举对象
     * @return 返回枚举的名称
     */
    public String getEnumName(Enum<?> theEnum) {
        if (theEnum == null) {
            return null;
        }
        return getEnumName(theEnum, theEnum.name());
    }
    
    public String getEnumName(Enum<?> theEnum, String defaultValue) {
        return msg.getMessage(getEnumKey(theEnum), defaultValue);
    }
    
    /**
     * 返回 {@link Enume} 的名称。类内部定义的枚举则key中包含该类的名称
     * @param theEnume 枚举对象
     * @return 返回 {@link Enume} 的名称
     */
    public <T extends Enume<?>> String getEnumName(T theEnume) {
        if (theEnume == null) {
            return null;
        }
        return getEnumName(theEnume, enumNameOrValue(theEnume));
    }
    
    public <T extends Enume<?>> String getEnumName(T theEnume, String defaultValue) {
        return msg.getMessage(getEnumKey(theEnume), defaultValue);
    }
    
    public static String getEnumKey(Enum<?> theEnum) {
        Class<?> enumClass = theEnum.getClass();
        if (enumClass.isMemberClass()) {
            return enumClass.getDeclaringClass().getSimpleName()
                    + "." + enumClass.getSimpleName()
                    + "." + theEnum.name();
        }
        return enumClass.getSimpleName() + "." + theEnum.name();
    }

    public static <T extends Enume<?>> String getEnumKey(T theEnume) {
        Class<?> enumClass = theEnume.getClass();
        String enumeName = enumNameOrValue(theEnume);
        if (enumClass.isMemberClass()) {
            return enumClass.getDeclaringClass().getSimpleName()
                    + "." + enumClass.getSimpleName()
                    + "." + enumeName;
        }
        return enumClass.getSimpleName() + "." + enumeName;
    }

    private static <T extends Enume<?>> String enumNameOrValue(T theEnume) {
        String enumeName = theEnume.name();
        if (enumeName == null) {
            enumeName = String.valueOf(theEnume.value());
        }
        return enumeName;
    }
    
}
